import java.awt.Graphics;
import java.awt.Point;
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.Iterator;
import java.util.LinkedList;

public class Fluxograma extends Desenhavel implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 3340697476821452835L;

	/**
	 * 
	 */

	/**
	 * @uml.property name="identificador"
	 * @uml.associationEnd multiplicity="(0 -1)" ordering="true"
	 *                     inverse="fluxograma:Identificador"
	 */
	private LinkedList<Identificador> identificadores;

	/**
	 * @uml.property name="ligacaoComTexto"
	 * @uml.associationEnd multiplicity="(0 -1)" ordering="true"
	 *                     inverse="fluxograma:LigacaoComTexto"
	 */
	private LinkedList<Ligacao> ligacoes;

	/**
		 */

	private LinkedList<Selecao> selecoes;

	private SelecaoTipo tipo;
	
	private ConetorTipo conetorTipo;

	private LinkedList<Conetor> conetores;

	public Fluxograma() {
		super();
		this.identificadores = new LinkedList<Identificador>();
		this.ligacoes = new LinkedList<Ligacao>();
		this.selecoes = new LinkedList<Selecao>();
		this.conetores = new LinkedList<Conetor>();

	}

	/**
			 */
	public void desenhar(Graphics graphics) {
		for (Ligacao ligacao : ligacoes) {
			ligacao.desenhar(graphics);
		}
		for (Identificador identificador : identificadores) {
			identificador.desenhar(graphics);
		}

		for (Selecao selecao : selecoes) {
			selecao.desenhar(graphics);
		}

		for (Conetor conetor : conetores) {
			conetor.desenhar(graphics);
			System.out.println("vou desehar os contores");
		}

	}

	/**
		 */
	public Identificador sob(Coordenada coordenada) {
		for (Identificador identificador : identificadores) {
			if (identificador.isSob(coordenada))
				return identificador;
		}
		return null;
	}

	public SelecaoTipo sobSelecao(Identificador identificador,
			Coordenada coordenada) {
		// DUVIDAS SOBRE ISTO.

		for (Selecao selecao : selecoes) {
			if (selecao.contem(identificador, coordenada) != null) {
				this.tipo = selecao.contem(identificador, coordenada);
				return this.tipo;
			}
		}
		return null;
	}

	/**
		 */
	public void adicionarIdentificador(Identificador identificador) {
		this.identificadores.add(identificador);
	}

	/**
		 */
	public Identificador Sob(Coordenada coordenada) {
		for (Identificador identificador : identificadores) {
			if (identificador.isSob(coordenada))
				return identificador;
		}

		return null;
	}

	public void adicionarLigacao(Ligacao ligacao) {
		// TODO Auto-generated method stub
		this.ligacoes.add(ligacao);
	}

	public void removerIdentificador(Identificador identificador) {
		// TODO Auto-generated method stub
		this.identificadores.remove(identificador);

		Iterator<Ligacao> iterator = ligacoes.iterator();
		while (iterator.hasNext()) {
			Ligacao ligacaoComTexto = iterator.next();
			if ((ligacaoComTexto).contains(identificador))
				iterator.remove();
		}

		Iterator<Selecao> iterator2 = selecoes.iterator();
		while (iterator2.hasNext()) {
			Selecao selecao = iterator2.next();
			if (selecao.contains(identificador))
				iterator2.remove();
		}

	}

	public void removerLigacao(Ligacao ligacao) {

		this.ligacoes.remove(ligacao);

	}

	public void removerSelecao(Selecao selecao) {
		this.selecoes.remove(selecao);

	}

	public void removeRetangulo(Retangulo selecao) {
		// TODO Auto-generated method stub
		this.selecoes.remove(selecao);
	}

	public void adicionarSelecao(Selecao selecao) {
		this.selecoes.add(selecao);
		// for (Selecao selecaos : selecoes)
		// {
		// selecaos.setSelecionado(Selecionado.FALSE);
		// }
	}

	public void retirarSelecao() {
		if (selecoes.isEmpty()) {
			System.out.println("estou vaziio");
		}
		for (Selecao selecao : selecoes) {
			selecao.setSelecionado(Selecionado.FALSE);
		}
	}

	@Override
	public String toString() {
		// TODO Auto-generated method stub
		StringBuilder sb = new StringBuilder();
		sb.append("FluxoGrama\n");
		sb.append("Numero de Identificadores").append(identificadores.size())
				.append("\n");
		for (Identificador identificador : identificadores) {
			sb.append(identificador);
			System.out.print(identificador);
		}
		return sb.toString();
	}

	public boolean isEmpty() {
		if (this.identificadores.size() == 0)
			return true;
		else
			return false;
	}

	public void adicionarConetores(Conetor pontosConetores) {
		// TODO Auto-generated method stub
		System.out.println("Adicionei os pontos.");
		conetores.add(pontosConetores);
	}

	public void removerConetores(Conetor pontosConetores) {
		// TODO Auto-generated method stub
		this.conetores.remove(pontosConetores);
	}

	public void removerTodosOsConetores() {
		if (!conetores.isEmpty()) {
			conetores.remove();
		}
	}
	
	public Point isSobConetor(Identificador identificador, Coordenada coordenada){
		
		for (Conetor conetor : conetores) {
			if (conetor.contem(identificador, coordenada) != null) {		
				return conetor.contem(identificador, coordenada);
			}
		}
		return null;
	}
}
